package ms.demo002;

/**
 *
 * 父类的实例化<clinit>：static修饰的
 * （1）j = method();
 * （2）父类的静态代码块
 *
 *  父类对象的实例化方法：非static修饰的
 * （1）super()（最前）
 * （2）i = test();
 * （3）父类的非静态代码块
 * （4）父类的无参构造（最后）
 *
 * 非静态方法前面其实有一个默认的对象this
 * this在构造器（或<init>）它表示的是正在创建的对象，因为这里是在创建Son对象，所以
 * test()执行的是子类重写的代码（面向对象多态）
 *
 * 这里i=test()执行的是子类重写的test()方法
 */
public class Father{
//	public int iii = testf();
	/**
	 * MYNOTICE 敲黑板：
	 * 实例化：由Class 创建对象的过程。
	 * Son子类对象实例化前先实例化 Father类对象，在给父类iii赋值（调用test()）会去调用子类重写的test()方法，而不是父类的test()。
	 * 但是，Son类的实例化前先实例化 Father类，在给父类jjj赋值时不会调用子类的method()方法，因为static方法是不可重写的。
	 */
	public int iii = test();
	public static int jjj = method();

	static{
		System.out.print("(1)");
	}
	Father(){
		System.out.print("(2)");
	}

	{
		System.out.print("(3)");
	}


//	public int testf(){
	public int test(){
		System.out.print("(4)");
		return 1;
	}

	public static int method(){
		System.out.print("(5)");
		return 1;
	}

}